Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
フィルタされたbagファイルを生成する
Description: このチュートリアルでは, トピックとデータの情報からbagファイルをフィルタして、新しいbagファイルにするためのrosbag filterの利用について取扱います.Keywords: rosbag record,rosbag play,rosbag filter
Tutorial Level: INTERMEDIATE
Next Tutorial: データの記録と再生
前項のチュートリアルでは, rosbag recordが引数のサブセットをどのように利用しているかだけを見てきました. しかし, 実行中のシステムにおいて, すべてのトピックを一つのbagファイルに記録してしまうrosbag record -aからbagファイルが生成されたことを考えてみましょう. bagファイルの入力ストリームから, このシステム内のノードのうちの一つを検証したかったとします. しかし, 記録が行われる時に検証のためのノードが発信するメッセージは再生したくない、bagファイルからのその他のすべての古いメッセージをシステムの中に入り込ませたくもない、そんな時, rosbag filterが, pythonのフィルタ表現を利用して, 古いbagファイルから新しいbagファイルを生成してくれます.
この例を確認するには, turtle_teleopからbagファイルを生成するために以前のチュートリアルの第1節を実行するか, このチュートリアルの中で作られたbagファイルがあるディレクトリに移動しましょう. bagファイルにrosbag infoを実行すると, turtlesimへの入力となる(/turtle1/cmd_vel)とturtlesimノードの出力である(/turtle1/poseと/turtle1/color_sensor)の両方が表示されるはずです. ここからturtlesimへの入力のみを含む新しいbagファイルを生成していきます.
既存のbagファイルを操作するために用いるコマンドはrosbag filterと呼ばれています:
Usage: rosbag filter: INBAG OUTBAG EXPRESSION EXPRESSION can be any Python-legal expression. The following variables are available: * topic: name of topic * m: message * t: time of message (t.secs, t.nsecs)
新しいbagファイルを生成するために, トピック名に基づいたフィルタリングを行いたい - 使用法の説明から"topic"がフィルタ表現として利用可能であることがわかります. /turtle1/cmd_velのトピック名を持つメッセージをフィルタするとして, 以下のコマンドを実行します:
rosbag filter <your bagfile> turtlecom.bag 'topic == "/turtle1/cmd_vel"'
ここでrosbag infoをturtlecom.bagについて実行してみましょう. cmd_velに対する唯一のトピックが表示されるはずです.
pythonフィルタの機能はトピック名によるメッセージの分離以上のことに対しても及びます - メッセージ内の実データに基づいたフィルタリングも可能です. 例えば, turtlesimの元々のteleopが以下のような挙動を示したと仮定します:
さらにturtlesim内で左旋回のみを行う制御アルゴリズムを試したい場合のことも考えてみましょう. 以下のコマンドは, 右(角速度では負)の値を出す指令に関連したものを除外するように, turtlecom.bagにフィルタを通します.
rosbag filter turtlecom.bag left_only.bag "m.angular.z >= 0"
turtlesimを通して再生した場合の結果は, 左旋回のみを示します: